package schuchert.contest;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;

public class ConTestInsrumentationMainBasedClassFileTransformerFilterTest {
    ConTestInstrumentationMainBasedClassFileTransformer transformer;

    @Before
    public void setup() {
        transformer = new ConTestInstrumentationMainBasedClassFileTransformer();
    }

    @Test
    public void withNoFilterEverythingAlwaysPasses() {
        transformer.setFilter("");
        assertIsNotFiltered("com/ibm");
        assertIsNotFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");

    }

    @Test
    public void onlyExcludeClassesStartingWithJava() {
        transformer.setFilter("-java");
        assertIsNotFiltered("com/ibm");
        assertIsFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");
    }

    @Test
    public void onlyIncludedClassesStartingWithJava() {
        transformer.setFilter("+java");
        assertIsFiltered("com/ibm");
        assertIsNotFiltered("java/io");
        assertIsFiltered("schuchert/contest/");
    }

    @Test
    public void multipleExclusionsLeaveDefaultRepsonseToTrueIfNoMatchesFound() {
        transformer.setFilter("-java:-com");
        assertIsFiltered("java/io");
        assertIsNotFiltered("schuchert/contest/");
        assertIsFiltered("com/ibm");
    }

    private void assertIsNotFiltered(String string) {
        assertTrue(transformer.isClassWeShouldProcess(string));
    }

    private void assertIsFiltered(String string) {
        assertFalse(transformer.isClassWeShouldProcess(string));
    }
}
